# 最基本的页面属性配置，配置宽度、高度、边距。提供方法获取bbox和包含边距的bbox

'''具有基本属性的基本页面，例如宽度、高度和边距。'''
class BasePage:
    def __init__(self, width:float=0.0, height:float=0.0, margin:tuple=None):
        '''初始化页面布局。

        参数:
            width (float, optional): 页面宽度。默认为0.0。
            height (float, optional): 页面高度。默认为0.0。
            margin (tuple, optional): 页面边距。默认为None。
        '''
        # 页面大小和边距
        self.width = width
        self.height = height
        
        # 如果margin为None，则设置为(0, 0, 0, 0)
        # 对应的是[左, 右, 上, 下]
        self.margin = margin or (0,) * 4
    
    # @property装饰器，将方法转换为属性
    # ·让一个方法可以像属性一样被访问，无需使用括号调用
    # ·可以使用 对象.方法名 而不是 对象.方法名()
    # ·防止属性被意外修改（通过只定义 getter 而不定义 setter）
    # 获取整个页面的bbox（不考虑margin边距）
    @property
    def bbox(self): return (0.0, 0.0, self.width, self.height)
    
    @bbox.setter
    def bbox(self, value):
        self.width, self.height = value[2], value[3]
    
    # 通过del obj.bbox调用
    @bbox.deleter
    def bbox(self):
        self.width, self.height = 0.0, 0.0

    # 获取考虑了边距的bbox
    @property
    def working_bbox(self):
        '''考虑了边距的边界框。'''
        x0, y0, x1, y1 = self.bbox
        L, R, T, B = self.margin
        return (x0+L, y0+T, x1-R, y1-B)